package middleware

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

// Result 统一响应JSON格式
type Result struct {
	Status    bool        `json:"status"`     //响应状态
	Code      int         `json:"code"`       //状态码
	Data      interface{} `json:"data"`       //响应数据
	Message   string      `json:"message"`    //响应消息
	ErrorInfo string      `json:"error_info"` //错误信息
}

// SuccessResult 成功响应的JSON格式
type SuccessResult struct {
	Status  bool        `json:"status"`                   //响应状态
	Code    int         `json:"code" example:"200"`       //状态码
	Data    interface{} `json:"data" `                    //响应数据
	Message string      `json:"message" example:"业务执行成功"` //响应消息
}

// Fail404Result 404失败响应的JSON格式
type Fail404Result struct {
	Code      int         `json:"code" example:"404"`         //状态码
	Data      interface{} `json:"data" `                      //响应数据
	Message   string      `json:"message" example:"页面未找到"`    //响应消息
	ErrorInfo string      `json:"error_info" example:"错误的信息"` //错误信息
}

// Fail500Result 500失败响应的JSON格式
type Fail500Result struct {
	Code      int         `json:"code" example:"500"`         //状态码
	Data      interface{} `json:"data"`                       //响应数据
	Message   string      `json:"message" example:"业务执行失败"`   //响应消息
	ErrorInfo string      `json:"error_info" example:"错误的信息"` //错误信息
}

// Fail 业务逻辑执行失败
func Fail(c *gin.Context, code int, message string, error string) {
	c.JSON(http.StatusOK, Result{
		Code:      code,
		Data:      nil,
		Message:   message,
		ErrorInfo: error,
	})

	//c.Error(errors.New(error))
	c.Abort()
}

// Success  接口执行成功,返回数据
func Success(c *gin.Context, code int, message string, data interface{}) {
	c.JSON(code, Result{
		Status:  true,
		Code:    code,
		Data:    data,
		Message: message,
	})
}

// GlobalErrorMiddleware 返回拦截中间件
func GlobalErrorMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		//先执行请求
		c.Next()

		if len(c.Errors) > 0 {
			//获取最后一个error返回
			err := c.Errors.Last()

			//Fail(c, http.StatusInternalServerError, "接口执行失败", err.Error())
			fmt.Println(c.Request.URL, "::接口执行错误:", err)
			return
		}
	}
}
